home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 23 / AACD 23.iso / AACD / Programming / tek / examples / taskterror.c < prev    next >
C/C++ Source or Header  |  2001-05-12  |  2KB  |  119 lines

  1.  
  2. /*
  3. **    tek/examples/taskterror.c
  4. **    create a tree of childtasks
  5. */
  6.  
  7. #include <stdio.h>
  8. #include <tek/exec.h>
  9.  
  10. #define CHILDSPERNODE    10
  11. #define MAXTASKS        400
  12. #define CHILDSIGREADY    0x80000000
  13.  
  14. struct shareddata
  15. {
  16.     TLOCK lock;
  17.     TUINT taskcount;
  18. };
  19.  
  20. void childfunc(TAPTR task)
  21. {
  22.     TAPTR childs[CHILDSPERNODE];
  23.     struct shareddata *data;
  24.     TTAGITEM tags[2];
  25.     TUINT i;
  26.     
  27.     data = TTaskGetData(task);
  28.     
  29.     TInitTags(tags);
  30.     TAddTag(tags, TTask_UserData, (TTAG) data);
  31.  
  32.     TLock(&data->lock);
  33.  
  34.     for (i = 0; i < CHILDSPERNODE; ++i)
  35.     {    
  36.         if (data->taskcount < MAXTASKS)
  37.         {
  38.             if ((childs[i] = TCreateTask(task, childfunc, tags)))
  39.             {
  40.                 data->taskcount++;
  41.                 /*printf("\r%d tasks ", data->taskcount);
  42.                 fflush(NULL);*/
  43.             }
  44.             else
  45.             {
  46.                 data->taskcount = MAXTASKS;
  47.             }
  48.         }
  49.         else
  50.         {
  51.             childs[i] = TNULL;
  52.         }
  53.     }
  54.  
  55.     if (data->taskcount >= MAXTASKS)
  56.     {
  57.         TSignal(TTaskBaseTask(task), CHILDSIGREADY);
  58.     }
  59.  
  60.     TUnlock(&data->lock);
  61.  
  62.     TWait(task, TTASK_SIG_ABORT);
  63.  
  64.     for (i = 0; i < CHILDSPERNODE; ++i)
  65.     {
  66.         if (childs[i])
  67.         {
  68.             TSignal(childs[i], TTASK_SIG_ABORT);
  69.             TDestroy(childs[i]);
  70.         }
  71.     }
  72. }
  73.  
  74.  
  75. int main(int argc, char **argv)
  76. {
  77.     TAPTR basetask, subtask;
  78.  
  79.     basetask = TCreateTask(TNULL, TNULL, TNULL);
  80.     if (basetask)
  81.     {
  82.         struct shareddata data;
  83.         data.taskcount = 1;
  84.  
  85.         if (TInitLock(basetask, &data.lock, TNULL))
  86.         {
  87.             TTIME time1, time2, time3;
  88.             TTAGITEM tags[2];
  89.             
  90.             TInitTags(tags);
  91.             TAddTag(tags, TTask_UserData, &data);
  92.  
  93.             printf("creating a tree of %d tasks, with %d childs per node\n", MAXTASKS, CHILDSPERNODE);
  94.  
  95.             TTimeQuery(basetask, &time1);
  96.  
  97.             subtask = TCreateTask(basetask, childfunc, tags);
  98.             if (subtask)
  99.             {
  100.                 TWait(basetask, CHILDSIGREADY);
  101.                 TTimeQuery(basetask, &time2);
  102.                 TSignal(subtask, TTASK_SIG_ABORT);
  103.                 TDestroy(subtask);
  104.             }
  105.  
  106.             TTimeQuery(basetask, &time3);
  107.  
  108.             printf("done. time elapsed:\n");
  109.             printf("creating tasks:   %.4fs\n", TTIMETOF(&time2) - TTIMETOF(&time1));
  110.             printf("destroying tasks: %.4fs\n", TTIMETOF(&time3) - TTIMETOF(&time2));
  111.  
  112.         }
  113.         TDestroy(basetask);
  114.     }
  115.  
  116.     return 0;
  117. }
  118.  
  119.